package com.xunge.controller;

import com.xunge.anno.Log;
import com.xunge.pojo.Grade;
import com.xunge.pojo.GradeQueryParam;
import com.xunge.pojo.PageResult;
import com.xunge.pojo.Result;
import com.xunge.service.GradeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RequestMapping("/grades")
@RestController
public class GradeController {
    @Autowired
    private GradeService gradeService;

    /**
     * 分页查询成绩信息
     *
     * @param gradeQueryParam 分页查询参数，包含页码、每页条数等信息
     * @return 返回分页结果，包含成绩信息列表和分页相关数据
     */
    @GetMapping
    public Result page(GradeQueryParam gradeQueryParam){
        // 记录分页查询请求参数的日志
        log.info("分页请求参数:{}" ,gradeQueryParam);

        // 调用服务层方法执行分页查询，并返回查询结果
        PageResult<Grade> pageResult = gradeService.page(gradeQueryParam);
        return Result.success(pageResult);
    }

    /**
     * 保存成绩信息
     *
     * @param grade 待保存的成绩信息，包括成绩的基本数据
     * @return 返回保存结果，成功则返回成功信息
     */
    @Log
    @PostMapping
    public Result save(@RequestBody Grade grade){
        // 记录保存成绩信息请求的日志
        log.info("保存信息：{}",grade);
        // 调用服务层方法保存成绩信息
        gradeService.save(grade);
        return Result.success();
    }

    /**
     * 批量删除成绩信息
     *
     * @param ids 需要删除的成绩ID列表
     * @return 返回删除结果，成功则返回成功信息
     */
    @Log
    @DeleteMapping
    public Result delete(@RequestParam List<Integer> ids){
        // 记录批量删除请求的日志
        log.info("根据ID批量删除成绩信息: {}",ids);
        // 调用服务层方法执行批量删除
        gradeService.delete(ids);
        return Result.success();
    }

    /**
     * 根据ID查询成绩信息
     *
     * @param id 需要查询的成绩ID
     * @return 返回查询结果，包括成绩的详细信息
     */
    @GetMapping("/{id}")
    public Result getInfo(@PathVariable Integer id){
        // 记录根据ID查询成绩信息请求的日志
        log.info("根据ID查询成绩信息: {}",id);
        // 调用服务层方法根据ID查询成绩信息
        Grade grade = gradeService.getById(id);
        return Result.success(grade);
    }

    /**
     * 根据ID修改成绩信息
     *
     * @param grade 包含需要更新的成绩信息，包括成绩ID和修改后的数据
     * @return 返回修改结果，成功则返回成功信息
     */
    @Log
    @PutMapping
    public Result update(@RequestBody Grade grade){
        // 记录根据ID修改成绩信息请求的日志
        log.info("根据ID修改成绩信息：{}",grade);
        // 调用服务层方法执行修改操作
        gradeService.update(grade);
        return Result.success();
    }

    /**
     * 根据学生ID查询成绩
     *
     * @param studentId 学生ID
     * @return 返回该学生的所有成绩信息
     */
    @GetMapping("/student/{studentId}")
    public Result getByStudentId(@PathVariable Integer studentId){
        // 记录根据学生ID查询成绩请求的日志
        log.info("根据学生ID查询成绩: {}",studentId);
        // 调用服务层方法根据学生ID查询成绩
        List<Grade> grades = gradeService.getByStudentId(studentId);
        return Result.success(grades);
    }

    /**
     * 根据课程ID查询成绩
     *
     * @param courseId 课程ID
     * @return 返回该课程的所有成绩信息
     */
    @GetMapping("/course/{courseId}")
    public Result getByCourseId(@PathVariable Integer courseId){
        // 记录根据课程ID查询成绩请求的日志
        log.info("根据课程ID查询成绩: {}",courseId);
        // 调用服务层方法根据课程ID查询成绩
        List<Grade> grades = gradeService.getByCourseId(courseId);
        return Result.success(grades);
    }

    /**
     * 批量导入成绩
     *
     * @param grades 成绩列表
     * @return 返回导入结果
     */
    @Log
    @PostMapping("/batch")
    public Result batchImport(@RequestBody List<Grade> grades){
        // 记录批量导入成绩请求的日志
        log.info("批量导入成绩: {}",grades);
        // 调用服务层方法批量导入成绩
        gradeService.batchImport(grades);
        return Result.success();
    }
} 